package main.SQL;

import main.Trees.ProjectNode;

import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;

public class OpenSQLProject {

    private Connection connSQL;
    private ProjectNode root;

    //region OpenSQLProject() - конструктор класса
    public OpenSQLProject() {

        try {
            this.root = new ProjectNode("Primavera P6 Structure");
            connSQL = MsSQLConnect.ConnectDB("Factage");

            if (connSQL != null) {
                fillOpenProjectTree();
                connSQL.close();
            }

        } catch (SQLException e) { e.printStackTrace(); }
    }
    //endregion

    //region Заполнение дерева баз данных, eps, проектов
    private void fillOpenProjectTree() throws SQLException {

        //region Загружаем базы данных из SQL
        CallableStatement cstmt = connSQL.prepareCall("{call getDbName()}");
        ResultSet rs = cstmt.executeQuery();
        HashMap<String, ProjectNode> dbMap = new HashMap<>();
        while ( rs.next() ) {
            ProjectNode curDb = new ProjectNode(rs, "db");
            dbMap.put(rs.getString("db_name"), curDb);
            root.add(curDb);
        }
        cstmt.close();
        //endregion

        //region Загружаем структуру EPS из SQL
        Statement stmt = connSQL.createStatement();
        ArrayList<ProjectNode> epsList = new ArrayList<>();
        HashMap<String, ProjectNode> epsMap = new HashMap<>();
        rs = stmt.executeQuery( "SELECT * FROM eps" );
        while (rs.next()) {
            ProjectNode curEps = new ProjectNode(rs, "eps");
            epsMap.put(rs.getString("db_name") + "-" + rs.getInt("id"), curEps);
            epsList.add(curEps);
            if (curEps.getParentId() == 0) dbMap.get(curEps.getDbName()).add(curEps);
        }

        for (ProjectNode eps : epsList) {
            if (eps.getParentId() != 0) {
                epsMap.get(eps.getDbName() + "-" + eps.getParentId()).add(eps);
            }
        }
        //endregion

        //region Загружаем структуру проектов из SQL
        rs = stmt.executeQuery( "SELECT * FROM project" );
        while (rs.next()) {
            ProjectNode proj = new ProjectNode(rs, "project");
            if (proj.getParentId() != 0) {
                epsMap.get(proj.getDbName() + "-" + proj.getParentId()).add(proj);
            } else {
                dbMap.get(proj.getDbName()).add(proj);
            }
        }
        //endregion

        rs.close();
        stmt.close();

    }
    //endregion

    public ProjectNode getRoot () {
        return root;
    }

}